署名バージョン2のS3 APIログをCloudWatch Logs Insights で集計してみた
はじめに
AWSチームのすずきです。
署名バージョン 2 のS3 API ログを CloudWatch Logs に転送し、CloudWatch Logs Insights による可視化、利用状況の確認を行う機会がありましたので、紹介させて頂きます。
構成図
設定
以下記事で紹介させて頂いた設定に、CloudWatch Logsへの出力を行うLambda関数と、関連する設定を追加しています。
SNS
- サブスクリプションとしてLambdaを追加しました。
Lambda
トリガー
- ログ発生量が多くCloudWatchLogsの費用が問題となる場合、Lambdaのトリガーを無効化してください。
コード
- ブループリントとして事前設定されたテンプレートに、ログ項目の絞り込み処理を追加しました。
- ログ解析時に Lambda に関連するログは除外するものとして、標準出力のみを利用する実装としました。
- 解析対象となるS3のログと、Lambdaの実行ログの混在が問題となる場合、SDK(Boto3)を利用して別ロググループへの出力をお試し下さい。
import json def lambda_handler(event, context): a = json.loads(event['Records'][0]['Sns']['Message'])['detail'] b = {} b["eventTime"] = a['eventTime'] b["eventSource"] = a['eventSource'] b["eventName"] = a['eventName'] b["sourceIPAddress"] = a['sourceIPAddress'] b["userAgent"] = a['userAgent'] b["requestParameters"] = a['requestParameters'] b["userIdentity"] = a['userIdentity'] b["additionalEventData"] = a['additionalEventData'] print(json.dumps(b)) return b
ログ設定
- Lambda標準出力されたログ(ロググループ)は、「CloudWatchのログを表示」から確認可能です。
動作確認
署名バージョン 2 のS3 API 利用で発生したログをCloudWatchのダッシュボードで確認しました。
イベントの検索
ロググループの「イベントの検索」より、該当するログを確認する事が可能です。
CloudWatch Logs Insights
- ロググループを指定後、任意のクエリ、期間を指定して指定で解析を行います。
- スキャン対象となったログ、1 GB あたり 0.0076 $の従量課金が発生する点に留意してご利用ください。
個別ログ確認
@message
指定によりログレコードの全体の確認が可能です。- ログレコードを展開する事で詳細が確認可能です。認識したカラムは後述の集計やフィルタ対象として利用可能です。
- SigV2 S3 API 利用 ログ、20件の抽出
fields @timestamp, @message | sort @timestamp desc | filter additionalEventData.SignatureVersion = 'SigV2' | filter eventSource = 's3.amazonaws.com' | limit 20
集計
ソースIP、接続先のS3情報などを指定した集計処理も可能です。
- SigV2 S3 API 利用 ログ、実行元ソースIPとS3バケット名別集計
stats count(*) by sourceIPAddress, requestParameters.bucketName | filter additionalEventData.SignatureVersion = 'SigV2' | filter eventSource = 's3.amazonaws.com'
- UserAgent、S3バケット 別集計
stats count(*) by userAgent, requestParameters.bucketName | filter additionalEventData.SignatureVersion = 'SigV2' | filter eventSource = 's3.amazonaws.com'
まとめ
CloudWatch Logs Insights を利用する事で、CloudTrailの証跡ログを効率よく確認する事が出来ました。
CloudTrailの証跡ログ、CloudWatch Logsに直接保存する事も可能ですが、 ログ発生量が多い場合 CloudWatchLogs のコストが問題となる事がありました。
今回の様にログの解析要件が明確な場合、CloudWatch Event、SNS、Lambda などを用いた前処理を行う事で、 コスト効率の良い利用が実現できる可能性がありますので、ぜひお試し下さい。
テンプレート
以下の記事で紹介したテンプレートに、Lambda関数とその関連設定を追加したものです。